1.3 NumPy - Algebra liniowa

NumPy jest pakietem szczególnie przydatnym do obliczeń w dziedzinie algebry liniowej. W uczeniu maszynowym algebra liniowa będzie miała duże znaczenie.

Wektor o wymiarach $1 \times N$

$$ X = \begin{pmatrix} x_{1} \\ x_{2} \\ \vdots \\ x_{N} \end{pmatrix} $$

i jego transpozycję $\mathbf{x}^{T} = (x_{1}, x_{2},\ldots,x_{N})$ można wyrazić w Pythonie w następujący sposób:


In [2]:
import numpy as np
x = np.array([[1,2,3]]).T
xt = x.T
x.shape


Out[2]:
(3, 1)

In [4]:
xt.shape


Out[4]:
(1, 3)

Macierz kolumnowa w NumPy. $$X = \begin{pmatrix} 3 \\ 4 \\ 5 \\ 6 \end{pmatrix}$$


In [6]:
x = np.array([[3,4,5,6]]).T
x


Out[6]:
array([[3],
       [4],
       [5],
       [6]])

A macierz wierszowa w NumPy. $$ X = \begin{pmatrix} 3 & 4 & 5 & 6 \end{pmatrix}$$


In [8]:
x = np.array([[3,4,5,6]])
x


Out[8]:
array([[3, 4, 5, 6]])

Obiekty typu matrix

Macierze ogólne omówiliśmy już w poprzednich dokumentach:

$$A_{m,n} = \begin{pmatrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\ a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m,1} & a_{m,2} & \cdots & a_{m,n} \end{pmatrix}$$

Oprócz obiektów typu array istnieje wyspecjalizowany obiekt matrix, dla którego operacje * (mnożenie) oraz **-1 (odwracanie) są określone w sposób właściwy dla macierzy (w przeciwieństwu do operacji elementowych dla obietków array).


In [46]:
x = np.array([1,2,3,4,5,6,7,8,9]).reshape(3,3)
x


Out[46]:
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

In [48]:
X = np.matrix(x)
X


Out[48]:
matrix([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])

Operacje na macierzach

Wyznacznik


In [9]:
a = np.array([[3,-9],[2,5]])
np.linalg.det(a)


Out[9]:
33.000000000000014

Macierz odwrotna


In [59]:
A = np.array([[-4,-2],[5,5]])
A


Out[59]:
array([[-4, -2],
       [ 5,  5]])

In [60]:
invA = np.linalg.inv(A)
invA


Out[60]:
array([[-0.5, -0.2],
       [ 0.5,  0.4]])

In [61]:
np.round(np.dot(A,invA))


Out[61]:
array([[ 1.,  0.],
       [ 0.,  1.]])

Ponieważ $AA^{-1} = A^{-1}A = I$.

Wartości i wektory własne


In [15]:
a = np.diag((1, 2, 3))
a


Out[15]:
array([[1, 0, 0],
       [0, 2, 0],
       [0, 0, 3]])

In [18]:
w,v = np.linalg.eig(a)
w


Out[18]:
array([ 1.,  2.,  3.])

In [20]:
v


Out[20]:
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

Zadania 1.3

Zapisz i oblicz za pomocą NumPy

  1. iloczn macierzy $A$ z wektorem $\vec{x}$: $$\begin{align*} A \vec{x} &= \left[ \begin{array}{rrr} 1 & -1 & 2\\ 0 & -3 & 1 \end{array} \right] \left[ \begin{array}{l} 2\\1\\0 \end{array}

    \right]

    \left[ \begin{array}{r} 1\\ -3 \end{array} \right]. \end{align*}$$

  2. iloczyn macierzy $A$ i $B$:
    $$\begin{align*} AB &=\left[ \begin{array}{rrr}

     0 & 4 & -2\\
     -4 & -3 & 0
    

    \end{array} \right] \left[ \begin{array}{rr}

     0 &1\\
     1 & -1\\
     2 & 3
    

    \end{array}

    \right]

    \left[ \begin{array}{rr}

     0 & -10\\
     -3 & -1
    

    \end{array} \right]. \end{align*}$$

  3. Pokaż, że dla powyśzych macierzy $A$ i $B$ prawdą jest, że $(AB)^T = B^TA^T$.

  4. Oblicz $\det(AB)$ (wyznacznik iloczynu $AB$).
  5. Czym rózni się operacja A**-1 dla obiektów typu array i matrix? Pokaż na przykładzie.
  6. Dla macierzy $X = \left[ \begin{array}{rrr}
     1 & 2 & 3\\
     1 & 3 & 6 \\
    
    \end{array} \right]$ oraz wektora $\vec{y} = \left[ \begin{array}{r}
     5 \\
     6 \\
    
    \end{array} \right]$ oblicz wynikowy wektor: $$\vec{\theta} = (X^TX)^{-1}X^T\vec{y} = \left[ \begin{array}{r}
     -11.75\\
     8.5 \\
     -0.6875 \\
    
    \end{array} \right]$$. Wykonaj te same obliczenia raz na obiektach typu array i raz na obiektach typu matrix. W przypadku obiektów typu matrix użyj możliwie krótki zapis.